Jetpack Compose 2023 年 8 月版最新动态
作者 / Android 开发者关系工程师 Ben Trengrove
我们在 Compose 2023 年 8 月物料清单 (BoM) 中发布了 Jetpack Compose 1.5 版本。Jetpack Compose 是 Android 现代原生界面工具包,已经被 Google Play 商店、Dropbox 和 Airbnb 等应用采用。此版本主要侧重于性能改进,因为我们从 2022 年 10 月版本开始的修饰符重构工作的主要部分现已完成合并。
Compose 2023 年 8 月物料清单 (BoM)
https://developer.android.google.cn/jetpack/androidx/releases/compose
Jetpack Compose
https://developer.android.google.cn/jetpack/compose
已经被众多应用采用
https://developer.android.google.cn/jetpack/compose#apps-built-with-compose
Google Play 商店
https://android-developers.googleblog.com/2022/03/play-time-with-jetpack-compose.html
Airbnb
https://android-developers.googleblog.com/2022/05/airbnb-uses-jetpack-compose.html
修饰符重构
https://www.youtube.com/watch?v=BjGX2RftXsU
性能
当我们于 2021 年首次推出 Compose 1.0 时,我们专注于确保 API 接口的准确性,以提供稳定的构建基础。我们那时想要功能强大、表现力强、易于使用且稳定的 API,以便让开发者在生产环境中放心使用。随着我们持续改进 API,性能成为首要任务,因此在 2023 年 8 月版本中,我们已经实现了许多性能改进。
修饰符性能
在此版本中,修饰符性能得到大幅提升,较构建之初提升高达 80%。最令人欣慰的是,由于我们在首个版本就确保了 API 接口的准确性,您只需升级到 2023 年 8 月版本,即可让大部分应用享受这些好处。
我们借助基准测试套件以监测性能是否退化,并利用测试结果决定在哪些方面投入资源以改进性能。在首次发布 Compose 1.0 后,我们开始关注需要改进的地方。基准测试结果表明,我们在实现修饰符方面消耗的时间超过了预期。修饰符构成组合树的绝大部分,因此对 Compose 中初始组合时间的影响最大。在 2022 年 10 月版本中,我们开始在内部重构修饰符以使其更加高效。
在 2022 年 10 月的版本中,最低等级模块 Compose 界面中增加了新的 API 和性能改进。由于修饰符是建立在彼此之上的,因此我们在接下来的 2023 年 3 月版本开始迁移 Compose Foundation 中的最低等级 Compose 修饰符。这包括 graphicsLayer、级别较低的焦点修饰符、padding 和 offset。这些低级别修饰符不仅用于 Clickable 等其他常用修饰符,还用于 Text 等许多框架可组合项。在 2023 年 3 月版本中,迁移修饰符已为这些组件带来性能提升,但当我们将更高等级的修饰符和可组合项本身迁移到新修饰符系统时,真正的优势才得以体现。
Compose 界面
https://developer.android.com/jetpack/androidx/releases/compose-uiCompose Foundation
https://developer.android.google.cn/jetpack/androidx/releases/compose-foundation
在 2023 年 8 月版本中,我们已开始将 Clickable 修饰符迁移至新修饰符系统,从而显著改善组合时间,在某些情况下改善幅度高达 80%。在包含可点击元素 (如按钮) 的惰性列表中,这一点尤为重要。Clickable 所使用的 Modifier.indication 仍在迁移中,因此我们预计未来的版本中还会有进一步更新。
迁移
https://android-review.googlesource.com/c/platform/frameworks/support/+/2528040Jetpack WindowManager
https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Indication.kt;l=104
新 API
https://android-review.googlesource.com/c/platform/frameworks/support/+/2318839
我们正在编写文档,帮助您将自己的修饰符迁移至新的 Modifier.Node API。您可以参考我们代码库中的示例,立即开始迁移。
我们代码库中的示例
https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/ModifierSamples.kt
如需详细了解上述更改背后的原理,您可以观看 2022 年 Android 开发者峰会的 "Compose 修饰符深度探讨" 演讲视频。
内存
内存泄漏
https://issuetracker.google.com/240975572
文本
TextMeasurer 和相关 API LineHeightStyle.Alignment(topRatio) Brush DrawStyle TextMotion DrawScope.drawText Paragraph.paint (brush, drawStyle, blendMode) MultiParagraph.paint (brush, drawStyle, blendMode) PlatformTextInput
LineHeightStyle.Alignment(topRatio)
https://android-review.googlesource.com/c/platform/frameworks/support/+/2485834Brush, DrawStyle, TextMotion, DrawScope.drawText, Paragraph.paint (brush, drawStyle, blendMode), MultiParagraph.paint (brush, drawStyle, blendMode)
https://android-review.googlesource.com/c/platform/frameworks/support/+/2550856
PlatformTextInput
https://android-review.googlesource.com/c/platform/frameworks/support/+/2465156
核心功能的改进与问题修复
LazyStaggeredGrid 现已稳定。 添加了 asComposePaint API 以取代 toComposePaint,前者返回的对象对原始 android.graphics.Paint 进行了封装。 添加了 IntermediateMeasurePolicy 以支持 SubcomposeLayout 中的先行传递 (Lookahead)。 添加了 onInterceptKeyBeforeSoftKeyboard 修饰符以在软键盘之前拦截按键事件。
IntermediateMeasurePolicy
https://cs.android.com/androidx/platform/tools/dokka-devsite-plugin/+/master:testData/compose/samples/ui/samples/SubcomposeLayoutSample.kt;l=56
onInterceptKeyBeforeSoftKeyboard
https://android-review.googlesource.com/c/platform/frameworks/support/+/2480419
开始使用!
问题跟踪页
https://issuetracker.google.com/issues/new?component=612128
路线图
httphttps://developer.android.google.cn/jetpack/androidx/compose-roadmap
推荐阅读